Global ObjectMapper কনফিগারেশন

Java Technologies - জ্যাকসন (Jackson) - Jackson এবং Spring Boot Integration
169

Jackson-এ ObjectMapper JSON serialization এবং deserialization-এর প্রধান ইঞ্জিন। যখন অ্যাপ্লিকেশনে বারবার ObjectMapper ব্যবহার করতে হয়, তখন একটি Global ObjectMapper তৈরি করা এবং সেটিকে কনফিগার করা সবচেয়ে ভালো পদ্ধতি। এটি কোড পুনরাবৃত্তি কমায় এবং কনসিস্টেন্ট JSON প্রসেসিং নিশ্চিত করে।


Global ObjectMapper কী?

Global ObjectMapper হলো একটি একক ObjectMapper ইনস্ট্যান্স যা অ্যাপ্লিকেশনের বিভিন্ন জায়গায় পুনঃব্যবহার করা যায়। এটি সাধারণত কাস্টম কনফিগারেশন দিয়ে সেটআপ করা হয়।

উদাহরণ: ObjectMapper Default Initialization

ObjectMapper objectMapper = new ObjectMapper();

1. Global ObjectMapper কনফিগারেশন পদ্ধতি

কাস্টম ObjectMapper সেটআপ:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class GlobalObjectMapper {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    static {
        // Include only non-null fields
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        // Pretty print JSON output
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);

        // Write dates as ISO-8601 strings
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    }

    public static ObjectMapper getInstance() {
        return objectMapper;
    }
}

ব্যবহার:

public class Main {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = GlobalObjectMapper.getInstance();

        // Example JSON serialization
        User user = new User();
        user.id = 101;
        user.name = "John Doe";

        String jsonOutput = objectMapper.writeValueAsString(user);
        System.out.println(jsonOutput);
    }
}

class User {
    public int id;
    public String name;
    public String email; // Will be excluded if null
}

আউটপুট:

{
  "id": 101,
  "name": "John Doe"
}

2. Spring Boot-এ Global ObjectMapper কনফিগারেশন

Spring Boot অ্যাপ্লিকেশন সাধারণত Jackson ObjectMapper কে স্বয়ংক্রিয়ভাবে সরবরাহ করে। আমরা কাস্টম ObjectMapper কনফিগার করতে চাইলে Spring Boot এর @Bean এবং Jackson2ObjectMapperBuilder ব্যবহার করতে পারি।

কাস্টম ObjectMapper Bean:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();

        // Include non-null fields only
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        // Pretty print
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        // Disable timestamps for dates
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        return mapper;
    }
}

ব্যবহার:

@RestController
@RequestMapping("/api")
public class UserController {

    private final ObjectMapper objectMapper;

    public UserController(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @GetMapping("/user")
    public String getUser() throws Exception {
        User user = new User();
        user.id = 101;
        user.name = "John Doe";

        return objectMapper.writeValueAsString(user);
    }
}

class User {
    public int id;
    public String name;
    public String email; // Will be excluded if null
}

3. ObjectMapper Global Settings

সাধারণ কনফিগারেশন অপশন:

  1. Serialization Features:
    • SerializationFeature.INDENT_OUTPUT: JSON ডেটা ফরম্যাট করা (pretty print)।
    • SerializationFeature.WRITE_DATES_AS_TIMESTAMPS: তারিখ ISO-8601 ফরম্যাটে লেখার জন্য।
  2. Deserialization Features:
    • DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES: অজানা ফিল্ড থাকলে ত্রুটি এড়াতে এটি নিষ্ক্রিয় করা যেতে পারে।

      objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
      
  3. Inclusion Rules:
    • JsonInclude.Include.NON_NULL: null ফিল্ড JSON-এ এড়িয়ে যাওয়া।
    • JsonInclude.Include.NON_EMPTY: null এবং খালি ফিল্ড বাদ দেওয়া।
  4. Date/Time Handling:
    • ISO-8601 ফরম্যাট:

      objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
      
  5. Custom Modules:
    • Jackson মডিউল যোগ করার জন্য:

      objectMapper.registerModule(new JavaTimeModule());
      

4. ObjectMapper with Custom Serializer/Deserializer

Custom Serializer:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

public class CustomNameSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString("Name: " + value);
    }
}

Custom Deserializer:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class CustomNameDeserializer extends JsonDeserializer<String> {
    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String name = p.getText();
        return name.replace("Name: ", "");
    }
}

ব্যবহার:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

class User {
    @JsonSerialize(using = CustomNameSerializer.class)
    @JsonDeserialize(using = CustomNameDeserializer.class)
    public String name;
}

5. Testing ObjectMapper Configuration

JUnit টেস্ট দিয়ে কনফিগারেশন পরীক্ষা করা যেতে পারে।

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class ObjectMapperTest {

    @Test
    void testObjectMapperConfiguration() throws Exception {
        ObjectMapper objectMapper = GlobalObjectMapper.getInstance();

        User user = new User();
        user.id = 101;
        user.name = "John Doe";

        String json = objectMapper.writeValueAsString(user);

        assertTrue(json.contains("John Doe"));
        assertFalse(json.contains("null"));
    }
}

উপকারিতা:

  1. Consistency: পুরো অ্যাপ্লিকেশনে একক ObjectMapper ইনস্ট্যান্স ব্যবহার করা।
  2. Reusability: কনফিগারেশন একবার সেটআপ করে সর্বত্র পুনর্ব্যবহার।
  3. Customization: বিভিন্ন serialization/deserialization প্রয়োজন অনুযায়ী কাস্টমাইজেশন।

Jackson-এর Global ObjectMapper কনফিগারেশন API ডেভেলপমেন্ট এবং ডেটা প্রসেসিং আরও সহজ এবং কার্যকর করে তোলে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...